Mastering Functions in TypeScript
1. Problem Statement
The city library needs a Report Generator module to automate routine tasks:
-
Display member details (ID, name, optional email).
-
Calculate total fines for overdue books (variable number per member).
-
Compute discounted membership fees with default rates.
-
Register daily visitors via callback.
-
Support different report formats via function overloading.
Manual scripts are tangled and error-prone. You need reusable, well-typed functions to organize this logic.
2. Learning Objectives
By the end of this tutorial, you will be able to:
-
Declare and call typed functions.
-
Use optional, rest, and default parameters.
-
Write anonymous and arrow functions.
-
Implement recursion and function overloading.
-
Define function types and use type aliases.
-
Pass functions as arguments (higher-order functions).
3. Concept Introduction with Analogy
Analogy: The Library Service Desks
Imagine the library’s front lobby organized into specialized desks, each demonstrating a key TypeScript function concept through its real-world role:
-
Information Desk (Function Declaration)
-
This desk greets you by name, looks up your membership details, and tells you which section to visit.
-
Just as the Information Desk has a clear menu of services (“show account,” “renew books,” “check due dates”), a declared function names its purpose and defines exactly what inputs it accepts and what output it provides.
-
-
Fine Collection Desk (Parameterized + Rest Parameters)
-
Patrons bring in one or many overdue slips all at once. The clerk takes a variable number of slips and tallies them in one go.
-
Like that desk, a function with rest parameters accepts a fixed initial piece of information (your member ID) plus any number of additional values (the fines), processing them all in the same streamlined step.
-
-
Membership Counter (Default Parameters)
-
New members pay a standard fee, but returning members with a coupon get a special discount. If no coupon is shown, the clerk defaults to the regular rate.
-
Similarly, a function can have parameters that default to a predefined value when no explicit argument is provided, ensuring consistent behavior without extra steps.
-
-
Visitor Kiosk (Callback Functions)
-
A touchscreen asks your name then calls a custom greeting routine-perhaps displaying your photo, printing a welcome card, or sending an SMS. The kiosk simply invokes whatever greeting function you’ve configured.
-
This mirrors higher-order functions: you supply the behavior (a callback) and the base function handles user input, then hands off control to your custom routine.
-
-
Special Services Desk (Function Overloads)
-
Patrons can request the library catalog in different formats: a printed handout, a PDF, or a USB drive with structured data. The same desk accepts the request and delivers the correct format.
-
Function overloads work the same way: a single name offers multiple “signatures” so callers can choose text, JSON, or other formats, with one underlying implementation adapting to the request.
-
4. Technical Deep Dive: Functions in TypeScript
-
Declaration vs. Expression: Named (
function foo(){}
) vs. anonymous (const foo = function(){}
) -
Parameters & Return Types:
function fn(a: number): string { … }
-
Optional Parameters: Marked
?
, must be last -
Rest Parameters:
...nums: number[]
, gather variable args -
Default Parameters:
rate: number = 0.1
-
Arrow Functions: Concise syntax
(a, b) => a + b
-
Recursion: Functions calling themselves with a base case
-
Function Overloads: Multiple signatures, single implementation
-
Function Types & Aliases:
(x: string) => void
;type Handler = (msg: string) => void
-
Higher-Order Functions: Functions accepting other functions as parameters
5. Step-by-Step Code Walkthrough
// 1. Simple Declaration & Optional Parameter
function displayMember(id: number, name: string, email?: string): void {
console.log(`ID: ${id}, Name: ${name}`);
if (email) console.log(`Email: ${email}`);
}
// 2. Rest Parameters for Fines Tally
function calculateFines(...fines: number[]): number {
let total = 0;
for (let fine of fines) total += fine;
return total;
}
// 3. Default Parameter for Discount
function membershipFee(price: number, discountRate: number = 0.1): number {
return price - price * discountRate;
}
// 4. Anonymous Function & Callback
function greetVisitor(visitor: string, formatter: (name: string) => void): void {
formatter(visitor);
}
const vipGreet = (name: string) => console.log(`Welcome VIP ${name}!`);
// 5. Recursion: Factorial (for demonstration)
function factorial(n: number): number {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// 6. Function Overloads for Report Generation
function generateReport(data: object[]): string;
function generateReport(data: object[], format: "json"): string;
function generateReport(data: any[], format?: string): string {
if (format === "json") {
return JSON.stringify(data, null, 2);
}
return data.map(item => item.toString()).join("\n");
}
// 7. Function Type & Alias
type VisitorFormatter = (name: string) => void;
let consoleGreet: VisitorFormatter = (n) => console.log(`Hello, ${n}!`);
6. Interactive Challenge / Mini‐Project
Your Turn!
-
Call
displayMember
for two members: one with email, one without. -
Use
calculateFines
to sum fines: 5, 10, 2.5. -
Compute a membership fee for $100 with default discount, then with 20%.
-
Greet visitors “Alice” and “Bob” using both
vipGreet
andconsoleGreet
. -
Compute
factorial(5)
. -
Generate a text report and a JSON report for an array of sample objects (e.g.,
{ title: "1984" }
).
7. Common Pitfalls & Best Practices
-
Optional parameters must come last.
-
Rest parameter can only appear once at the end.
-
Default vs. Optional: Don’t mix both on the same parameter.
-
Recursive functions need a clear base case to avoid infinite loops.
-
Provide
break
in overloads: ensureswitch
orif
chains cover all types. -
Explicit function types improve readability for callbacks.
8. Quick Recap & Key Takeaways
-
Functions organize code into reusable tasks.
-
TypeScript adds safety with parameter and return type annotations.
-
Optional, rest, and default parameters handle flexible argument patterns.
-
Anonymous, arrow, and constructor functions offer varied declaration styles.
-
Recursion and overloads provide advanced capabilities.
-
Function types and aliases clarify expected function shapes.